package com.example.library.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.library.entity.Category;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 图书分类Mapper接口
 */
@Mapper
public interface CategoryMapper extends BaseMapper<Category> {

    /**
     * 分页查询分类列表
     *
     * @param page     分页参数
     * @param keyword  关键词
     * @param status   状态
     * @param parentId 父分类ID
     * @return 分页结果
     */
    IPage<Category> selectCategoryPage(Page<Category> page,
                                       @Param("keyword") String keyword,
                                       @Param("status") Integer status,
                                       @Param("parentId") Long parentId);

    /**
     * 获取所有启用的分类
     *
     * @return 分类列表
     */
    @Select(value = "select * from categories where status = 1 order by created_time desc ")
    List<Category> selectEnabledCategories();

    /**
     * 根据父分类ID获取子分类
     *
     * @param parentId 父分类ID
     * @return 子分类列表
     */
    @Select(value = "select * from categories where parent_id = #{parentId} order by created_time desc")
    List<Category> selectByParentId(@Param("parentId") Long parentId);

    /**
     * 根据名称和父分类ID查询分类
     *
     * @param name     分类名称
     * @param parentId 父分类ID
     * @return 分类
     */
    @Select(value = "select * from categories where name = #{name} and parent_id = #{parentId}")
    Category selectByNameAndParentId(@Param("name") String name, @Param("parentId") Long parentId);

    /**
     * 统计子分类数量
     *
     * @param parentId 父分类ID
     * @return 子分类数量
     */
    @Select(value = "select count(*) from categories where parent_id = #{parentId}")
    Long countChildren(@Param("parentId") Long parentId);

    /**
     * 统计分类下的图书数量
     *
     * @param categoryId 分类ID
     * @return 图书数量
     */
    @Select(value = "select count(*) from books where category_id = #{categoryId}")
    Long countBooks(@Param("categoryId") Long categoryId);

    /**
     * 统计分类数量
     *
     * @param status   状态
     * @param parentId 父分类ID
     * @return 分类数量
     */
    @Select(value = "select count(*) from categories where status = #{status} and parent_id = #{parentId}")
    Long countCategories(@Param("status") Integer status, @Param("parentId") Long parentId);

    /**
     * 批量更新分类状态
     *
     * @param categoryIds 分类ID列表
     * @param status      状态
     * @return 更新数量
     */
    int batchUpdateStatus(@Param("categoryIds") List<Long> categoryIds, @Param("status") Integer status);

    /**
     * 获取热门分类（按图书数量排序）
     *
     * @param limit 限制数量
     * @return 热门分类列表
     */
    List<Category> selectPopularCategories(@Param("limit") Integer limit);
}